package com.me.study.arithmeticAndDataStructure.backoff;

import org.springframework.util.backoff.BackOffExecution;
import org.springframework.util.backoff.ExponentialBackOff;

/**
 * Spring 的指数退避算法工具类
 *
 * @author ME
 * @date 2021/9/27
 */
public class TestExponentialBackOff {

    public static void main(String[] args) {
        // 初始间隔（默认 2000），单位：毫秒
        long initialInterval = 100;
        // 递增倍数（默认 1.5）
        double multiplier = 2;
        // 单次最大时间间隔（默认 30000），单位：毫秒
        long maxInterval = 10 * 1000L;
        // 累计最大的时间间隔，单位：毫秒
        long maxElapsedTime = 30 * 1000L;

        ExponentialBackOff backOff = new ExponentialBackOff(initialInterval, multiplier);
        backOff.setMaxInterval(maxInterval);
        backOff.setMaxElapsedTime(maxElapsedTime);
        BackOffExecution execution = backOff.start();

        /*
         * 100
         * 200
         * 400
         * 800
         * 1600
         * 3200
         * 6400
         * 10000
         * 10000
         * -1
         */
        while (true) {
            long value = execution.nextBackOff();
            System.out.println(value);
            if (value == BackOffExecution.STOP) {
                break;
            }
        }
    }

}
